#include <iostream>
#include "set"

using namespace std;

/*
 * set/multiset   所有容器在插入时自动排序
 *      属于关联式容器，底层使用二叉树实现
 *
 *      区别  set容器中不允许有重复的元素，multiset允许有重复的元素
 * 构造和赋值
 *      set<T> st       默认构造函数
 *      set<T>(const set &st)   拷贝构造函数
 *      set & operator=(const set & st) 重载等号
 * 大小和交换
 *      size()  返回容器中元素的数目
 *      empty() 判断容器是否为空
 *      swap(st)    交换两个集合容器
 *  插入和删除
 *      insert(elem)    在容器中插入元素
 *      clear()     清楚所有元素
 *      erase(pos)  删除pos迭代器所指的元素，返回下一个元素的迭代器
 *      erase(st.begin(), st.end()) 删除[st.begin(), st.end())区间的所有元素，返回下一个元素的迭代器
 *      erase(elem)     删除容器中值为elem的元素
 *  查找和统计
 *      find(key)   查找key是否存在，若存在，返回key元素的迭代器，若不存在，返回st.end()
 *      count(key)  统计key的元素个数
 *  排序
 *      set容器默认从小到大排序   利用仿函数，可以改变排序规则
 */

void test01(){
    set<int> st;
    pair<set<int>::iterator, bool> res = st.insert(10);
    if(res.second){
        cout << "插入成功" << endl;
    } else{
        cout << "插入失败" << endl;
    }
    res = st.insert(10);
    if(res.second){
        cout << "插入成功" << endl;
    } else{
        cout << "插入失败" << endl;
    }
}

class MyCompare{
public:
    bool operator()(int v1, int v2){
        return v1 > v2;
    }
};

void test02(){
    set<int, MyCompare> st;   // 指定降序的方式
    st.insert(30);
    st.insert(10);
    st.insert(50);
    st.insert(40);
    st.insert(60);
    for (set<int, MyCompare>::iterator it= st.begin(); it != st.end() ; ++it) {
        cout << *it << " ";
    }
    cout << endl;
}

int main() {

    test01();

    test02();

    return 0;
}
